<?php

/**
 * Основні константи
 */
define('LS_VERSION','1.0.1');

/**
 * Operations with Config object
 */
require_once(dirname(dirname(__FILE__)) . "/engine/lib/internal/ConfigSimple/Config.class.php");
Config::LoadFromFile(dirname(__FILE__) . '/config.php');

$fGetConfig = create_function('$sPath', '$config=array(); return include $sPath;');

/** Завантажуємо конфіги модулів типу /config/modules/[module_name]/config.php */
loadConfig(null, $fGetConfig, true);

/** Підключаємо усі *.php файли з каталогу {path.root.engine}/include/ - це файли ядра */
includePHPFilesByPath('path.root.engine');

/** Підключаємо усі *.php файли з каталогу {path.root.server}/include/ - користувацькі файли */
includePHPFilesByPath('path.root.server');

/** Підключаємо конфіги БД */
loadConfig('db', $fGetConfig);

/** Підключаємо конфіги модулів */
loadConfig('module', $fGetConfig);

/** Підключаємо конфіги маршрутизатора */
loadConfig('router', $fGetConfig);

/** Підключаємо конфіги мемкеша */
loadConfig('memcache', $fGetConfig);

/** Підключаємо конфіги виду */
loadConfig('view', $fGetConfig);

/** Підключаємо конфіги блоків */
loadConfig('block', $fGetConfig);

/** Підключаємо конфіги ajax */
loadConfig('ajax', $fGetConfig);

function includePHPFilesByPath($sPath)
{
    $sDirInclude = Config::get($sPath) . '/include/';
    if ($hDirInclude = opendir($sDirInclude)) {
    	while (false !== ($sFileInclude = readdir($hDirInclude))) {
    		$sFileIncludePathFull = $sDirInclude . $sFileInclude;
    		if ($sFileInclude != '.' && $sFileInclude != '..' && is_file($sFileIncludePathFull)) {
    			$aPathInfo = pathinfo($sFileIncludePathFull);
    			if (isset($aPathInfo['extension']) && strtolower($aPathInfo['extension']) == 'php') {
    				require_once($sDirInclude . $sFileInclude);
    			}
    		}
    	}
    	closedir($hDirInclude);
    }
}

/**
 * Функція шукає конфіги по ключу і поєднює їх з поточними
 * @see Router.class.php
 */

function loadConfig($sKey, $fGetConfig, $hasModule = false)
{
    $sDirConfig = Config::get('path.root.server') . '/config/' . ((true === $hasModule) ? 'modules/' : '');
    if ($hDirConfig = opendir($sDirConfig)) {
    	while (false !== ($sDirModule = readdir($hDirConfig))) {
    		if ($sDirModule != '.' && $sDirModule != '..' && is_dir($sDirConfig . $sDirModule)) {
    			$sFileConfig = $sDirConfig . ((true === $hasModule) ? $sDirModule . '/' : '') . 'config' .
                    (empty($sKey) ? '' : '.' . $sKey) . '.php';
    			if (file_exists($sFileConfig)) {
    				$aConfig = $fGetConfig($sFileConfig);
    				if (!empty($aConfig) && is_array($aConfig)) {
                        if (true === $hasModule) {
                            $sKey = 'module.' . $sDirModule; //override sKey
                        }
    					if(!Config::isExist($sKey)) {
    						Config::Set($sKey,$aConfig);
    					} else {
    						Config::Set(
    							$sKey,
    							func_array_merge_assoc(Config::Get($sKey), $aConfig)
    						);
    					}
    				}
    			}
    		}
    	}
    	closedir($hDirConfig);
    }
}
//vdie(Config::getInstance()->GetConfig());
/**
 * Підключаємо файли локального и продакшн-конфіга
 */
if(file_exists(Config::Get('path.root.server') . '/config/config.local.php')) {
	Config::LoadFromFile(Config::Get('path.root.server') . '/config/config.local.php',false);
}

if(file_exists(Config::Get('path.root.server') . '/config/config.stable.php')) {
	Config::LoadFromFile(Config::Get('path.root.server') . '/config/config.stable.php',false);
}

/**
 * Підключаємо конфіги плагінів типу /plugins/[plugin_name]/config/*.php
 * і include-файли /plugins/[plugin_name]/include/*.php
 */

$sPluginsDir = Config::Get('path.root.server') . '/plugins';
$sPluginsListFile = $sPluginsDir . '/' . Config::Get('sys.plugins.activation_file');

if ($aPluginsList = @file($sPluginsListFile)) {
	$aPluginsList = array_map('trim', $aPluginsList);
	foreach ($aPluginsList as $sPlugin) {
		$aConfigFiles = glob($sPluginsDir . '/' . $sPlugin . '/config/*.php');
		if ($aConfigFiles && count($aConfigFiles) > 0) {
			foreach ($aConfigFiles as $sPath) {
				$aConfig = $fGetConfig($sPath);
				if (!empty($aConfig) && is_array($aConfig)) {
					$sKey = 'plugin.' . $sPlugin;
					if (!Config::isExist($sKey)) {
						Config::Set($sKey, $aConfig);
					} else {
						Config::Set(
							$sKey,
							func_array_merge_assoc(Config::Get($sKey), $aConfig)
						);
					}
				}
			}
		}
		/** Подключаємо include-файли */
		$aIncludeFiles = glob($sPluginsDir . '/' . $sPlugin . '/include/*.php');
		if ($aIncludeFiles && count($aIncludeFiles)) {
			foreach ($aIncludeFiles as $sPath) {
				require_once($sPath);
			}
		}
	}
}

?>